﻿==============================================================================
DOSYA ADI  : PremiumSystem.cpp
KAYNAK      :-GameServer\PremiumSystem.cpp
SISTEM      : v2369 Reconnect - SUNUCU
BOYUT       : 10502 bayt / 361 satir
ACIKLAMA    : Premium bitince reconnect hakkinin iptali
ESLESME     : 5 satir / 2 blok
==============================================================================

NOT: Bu dosya yalnizca RECONNECT ile ilgili kod bloklarini icerir.
     Satir numaralari KAYNAK dosyadaki orijinal satirlardir.

----------------------------------------------------------------------
>> KAYNAK SATIR 39 - 93
----------------------------------------------------------------------
    39 | 	uint8 counter = 0;
    40 | 	foreach_stlmap(itr, m_PremiumMap)
    41 | 	{
    42 | 		_PREMIUM_DATA * uPrem = itr->second;
    43 | 		if (uPrem == nullptr || uPrem->iPremiumTime == 0)
    44 | 			continue;
    45 | 
    46 | 		uint32 TimeRest = 0;
    47 | 		uint16 TimeShow = 0;
    48 | 		TimeRest = uint32(uPrem->iPremiumTime - UNIXTIME);
    49 | 		if (TimeRest >= 1 && TimeRest <= 3600)
    50 | 			TimeShow = 1;
    51 | 		else
    52 | 			TimeShow = TimeRest / 3600;
    53 | 
    54 | 		result << uPrem->bPremiumType << TimeShow;
    55 | 		counter++;
    56 | 
    57 | 		if (m_bPremiumInUse == NO_PREMIUM)
    58 | 			m_bPremiumInUse = uPrem->bPremiumType;
    59 | 	}
    60 | 
    61 | 	result << m_bPremiumInUse << uint32(0);
    62 | 	Send(&result);
    63 | 
    64 | 	// Reconnect senkronu: premium aktifleştiyse hemen token dağıtılır,
    65 | 	// süresi dolduysa (NO_PREMIUM) reconnect hakkı iptal edilir —
    66 | 	// bu yol HandlePremium / GivePremium / UpdateCheckPremiumTime
    67 | 	// (süre dolumu) için ortak giriş noktasıdır.
    68 | 	SyncReconnectEligibility();
    69 | }
    70 | 
    71 | /**
    72 | * @brief Gives user the premium bonus items.
    73 | */
    74 | void CUser::GivePremiumItem(uint8 bPremiumType)
    75 | {
    76 | 	Packet result(WIZ_SHOPPING_MALL, uint8(STORE_LETTER));
    77 | 	result << uint8(LetterOpcodes::LETTER_GIVE_PRE_ITEM) << bPremiumType;
    78 | 	g_pMain->AddDatabaseRequest(result, this);
    79 | }
    80 | 
    81 | void CUser::SendClanPremium(CKnights* pknight, bool exits /*= false*/)
    82 | {
    83 | 	m_bClanPremiumInUse = 0;
    84 | 	sClanPremStatus = false;
    85 | 	if (exits)
    86 | 		return SendClanPremiumPkt(pknight, exits);
    87 | 
    88 | 	if (!pknight || !pknight->isInPremium())
    89 | 		return;
    90 | 
    91 | 	m_bClanPremiumInUse = 13;
    92 | 	sClanPremStatus = true;
    93 | 	SendClanPremiumPkt(pknight, false);

----------------------------------------------------------------------
>> KAYNAK SATIR 288 - 340
----------------------------------------------------------------------
   288 | 		pPremium = new _PREMIUM_DATA;
   289 | 		pPremium->bPremiumType = bPremiumType;
   290 | 		pPremium->iPremiumTime = uint32(UNIXTIME) + 24 * 60 * 60 * sPremiumTime;
   291 | 		m_PremiumMap.PutData(bPremiumType, pPremium);
   292 | 	}
   293 | 	else
   294 | 	{
   295 | 		pPremium->bPremiumType = bPremiumType;
   296 | 		pPremium->iPremiumTime = pPremium->iPremiumTime + 24 * 60 * 60 * sPremiumTime;
   297 | 	}
   298 | 
   299 | 	m_bPremiumInUse = bPremiumType;
   300 | 	m_bAccountStatus = 1;
   301 | 
   302 | 	// BuhuR SWITCH Premium Notice Eklendi 01.01.2025
   303 | 	if (bPremiumType == SWITCH_PREMIUM)
   304 | 		g_pMain->SendYesilNotice(this, "[Premium] : Tebrikler SWITCH Premium Aktif Edildi");
   305 | 
   306 | 	Packet pkt(WIZ_PREMIUM);
   307 | 	g_pMain->AddDatabaseRequest(pkt, this);
   308 | 	m_switchPremiumCount++;
   309 | 
   310 | 	if (m_switchPremiumCount > 2)
   311 | 		SendPremiumInfo();
   312 | 
   313 | 	// Reconnect senkronu: switch premium aktifleşti (SendPremiumInfo bu yolda
   314 | 	// m_switchPremiumCount <= 2 iken çağrılmıyor) — token hemen dağıtılır.
   315 | 	SyncReconnectEligibility();
   316 | 
   317 | 	//BuhuR pre yükletince dc etmeden yenile karakteri işi garantiye aldık
   318 | 	CharacterOlduguYerdeYenile();
   319 | }
   320 | 
   321 | void CUser::GiveClanPremium(uint8 bPremiumType, uint32 sPremiumDay)
   322 | {
   323 | 	if (!isInClan() || !isClanLeader())
   324 | 		return;
   325 | 
   326 | 	CKnights* pKnights = g_pMain->GetClanPtr(GetClanID());
   327 | 	if (pKnights == nullptr)
   328 | 		return;
   329 | 
   330 | 	int remtime = pKnights->sPremiumTime > (uint32)UNIXTIME ? pKnights->sPremiumTime - (uint32)UNIXTIME : 0;
   331 | 	pKnights->sPremiumTime = ((uint32)UNIXTIME + 24 * 60 * 60 * sPremiumDay) + remtime;
   332 | 	pKnights->sPremiumInUse = PremiumTypes::CLAN_PREMIUM;
   333 | 
   334 | 	std::vector<std::string> mlist;
   335 | 	pKnights->m_arKnightsUser.m_lock.lock();
   336 | 	foreach_stlmap_nolock(i, pKnights->m_arKnightsUser) {
   337 | 		_KNIGHTS_USER* p = i->second;
   338 | 		if (p == nullptr) continue;
   339 | 
   340 | 		mlist.push_back(p->strUserName);

